const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'studentmanager';
const ObjectId = require('mongodb').ObjectId


const getcollection =(collectionName ,callback)=>{
    MongoClient.connect(url, function (err, client) {
        const db = client.db(dbName);
        const collection = db.collection(collectionName);
        
        callback(collection, client);
    });
}

/**
 * 
 * @param {*} collectionName 集合名
 * @param {*} params 查询参数
 * @param {*} callback 回调函数
 */
const findList = (collectionName,params,callback)=>{

    getcollection(collectionName,(collection, client) => {
        collection.find(params).toArray((err,docs)=>{
            client.close();
            callback(err,docs);
        });
    })
}






const findOne = (collectionName,params,callback)=>{

    getcollection(collectionName,(collection, client) => {
        collection.findOne(params,(err,docs)=>{
            client.close();
            callback(err,docs);
        });
    })
}

/**
 * 插入一条记录方法
 * @param {*} collectionName 集合名
 * @param {*} params 参数
 * @param {*} callback 回调函数
 */
const insert = (collectionName,params,callback)=>{
    getcollection(collectionName,(collection, client) => {
        collection.insertOne(params,  (err, resu)=> {
            client.close();
            callback(err, resu);
        })
    })
}

/**
 * 修改一条记录的方法
 * @param {*} collectionName 集合名称
 * @param {*} condition 条件
 * @param {*} params 参数
 * @param {*} callback 回调函数
 */
const update = (collectionName,condition,params,callback) =>{
    getcollection(collectionName,(collection, client) => {
        collection.updateOne(condition,{$set:params},(err,resu)=>{
            client.close();
            callback(err,resu);
        })
    })
}
/**
 * 
 * @param {*} collectionName 集合名
 * @param {*} params 参数
 * @param {*} callback 回调函数
 */
const deleteStudent = (collectionName,params,callback)=>{
    getcollection(collectionName,(collection, client) => {
        collection.deleteOne(params,(err,resu)=>{
            client.close();
            callback(err,resu);
        })
    })
}


module.exports = {
    findList,
    insert,
    ObjectId,
    findOne,
    update,
    deleteStudent
}